#ifndef SYSTEMCONFIG_H
#define SYSTEMCONFIG_H

#include <QString>
#include <QStandardPaths>
#include "unifiedfileinfo.h"  // 包含LayoutMode定义
#include "pathmanager.h"      // 跨平台路径管理器

/**
 * 新的系统配置枚举和结构体
 * 重构原则：用有意义的枚举替代魔法数字
 * 作者：Martin Fowler 重构方法
 */

// 内存性能策略枚举
enum class MemoryStrategy {
    PowerSaving,    // 节能模式 (20-30%可用内存)
    Balanced,       // 平衡模式 (40-50%可用内存)
    HighPerformance,// 高性能模式 (60-70%可用内存)
    Extreme         // 极致模式 (80%+可用内存)
};

// 页面处理质量枚举
enum class ProcessingQuality {
    Fast,           // 快速模式 (150 DPI)
    Standard,       // 标准模式 (200 DPI)
    High,           // 高质量模式 (300 DPI)
    Extreme         // 极致模式 (600 DPI)
};

// 前向声明 - 布局模式枚举已在unifiedfileinfo.h中定义
enum class LayoutMode;

/**
 * 新的系统配置结构体
 * 重构原则：将相关数据组织到一个cohesive的对象中
 */
struct SystemConfig {
    // === 性能配置 ===
    MemoryStrategy memoryStrategy = MemoryStrategy::Balanced;
    ProcessingQuality processingQuality = ProcessingQuality::High;

    // === 存储配置 ===
    QString cacheDirectory;              // 缓存目录
    QString outputDirectory;             // PDF输出目录
    QString logDirectory;                // 日志目录
    QString tempDirectory;               // 临时目录
    QString configDirectory;             // 配置目录
    int spaceThresholdGB = 2;           // 空间阈值(GB)

    // === 布局配置 ===
    LayoutMode pdfDefaultLayout = LayoutMode::SingleColumn;
    LayoutMode imageDefaultLayout = LayoutMode::TwoColumns;

    // === 构造函数 ===
    SystemConfig() {
        // 使用跨平台路径管理器获取标准目录
        cacheDirectory = PathManager::getCacheDirectory();
        outputDirectory = PathManager::getDefaultExportDirectory();
        logDirectory = PathManager::getLogDirectory();
        tempDirectory = PathManager::getTempDirectory();
        configDirectory = PathManager::getConfigDirectory();

        // 确保目录存在
        PathManager::ensureDirectoryExists(cacheDirectory);
        PathManager::ensureDirectoryExists(outputDirectory);
        PathManager::ensureDirectoryExists(logDirectory);
        PathManager::ensureDirectoryExists(tempDirectory);
        PathManager::ensureDirectoryExists(configDirectory);
    }

    // === 策略计算方法 ===
    // 重构原则：Extract Method - 将计算逻辑封装在对象内部
    int calculateMaxPagesInMemory() const;
    int calculatePreloadRange() const;
    double getProcessingDpi() const;

    // === 工具方法 ===
    static QString memoryStrategyToString(MemoryStrategy strategy);
    static MemoryStrategy memoryStrategyFromString(const QString& str);
    static QString processingQualityToString(ProcessingQuality quality);
    static ProcessingQuality processingQualityFromString(const QString& str);
    static QString layoutModeToString(LayoutMode mode);
    static LayoutMode layoutModeFromString(const QString& str);
};

/**
 * 配置策略计算器类
 * 重构原则：Extract Class - 将复杂的计算逻辑提取到专门的类中
 * 单一职责：专门负责根据策略计算具体的数值参数
 */
class ConfigStrategyCalculator {
public:
    // === 内存策略计算 ===
    static int calculateMaxPagesForStrategy(MemoryStrategy strategy);
    static int calculatePreloadRangeForStrategy(MemoryStrategy strategy);

    // === 处理质量计算 ===
    static double calculateDpiForQuality(ProcessingQuality quality);
    static QString getQualityDescription(ProcessingQuality quality);
    static QString getMemoryStrategyDescription(MemoryStrategy strategy);

    // === 系统内存检测 ===
    static qint64 getTotalSystemMemoryMB();
    static qint64 getAvailableMemoryMB();
    static bool isMemoryStrategyRecommended(MemoryStrategy strategy);
};

#endif // SYSTEMCONFIG_H